////////////////////////////////////////////////////////////////////////////////

#ifndef _SERVER_SESSION_H_
#define _SERVER_SESSION_H_

////////////////////////////////////////////////////////////////////////////////

#include <boost/asio.hpp>
using boost::asio::ip::tcp;

////////////////////////////////////////////////////////////////////////////////

class Server;
#include "network_packets.h"

////////////////////////////////////////////////////////////////////////////////


////////////////////////////////////////////////////////////////////////////////


/** Game server network session
*
*   Based on Boost.Asio cross-platform C++ library
*
*  @author   Roman Pasechnik
*  @since    Jun 11th, 2009
*  @updated  Jun 11th, 2009
*/
class ServerSession
{
////////////////////////////////////////////////////////////////////////////////

public:

////////////////////////////////////////////////////////////////////////////////


    /** Constructor */
    ServerSession( boost::asio::io_service& _io_service,
                   Server* _coordinator );


    /** Destructor */
    virtual ~ServerSession();


////////////////////////////////////////////////////////////////////////////////


    /** Sends data to client */
    void Send( const ServerPacket& _packet );


    /** Receives data from client */
    void Receive();


    /** Get socket reference */
    tcp::socket& GetSocket();


    /** Get session status */
    bool IsOK() const;


////////////////////////////////////////////////////////////////////////////////

private:

////////////////////////////////////////////////////////////////////////////////


    /** Start sending packets from queue */
    void StartSend();
    

    /** Handle received packet */
    void HandleReceive( const boost::system::error_code& _error, size_t _bytesReceived );


    /** Handle received packet */
    void HandleSend( const boost::system::error_code& _error, size_t _bytesReceived );


////////////////////////////////////////////////////////////////////////////////


    /** Session status */
    bool m_IsOK;


    /** Queue of packets for sending */
    ServerPackets m_SendQueue;


    /** IO service object */
    boost::asio::io_service& m_io_service;


    /** Socket for networking */
    tcp::socket m_Socket;


    /** Receive buffer size */
    enum
    {
        BUFFER_SIZE = 512
    };


    /** Receive buffer */
    boost::array<char, BUFFER_SIZE> m_RecvBuffer;


    /** Send buffer */
    std::vector<char> m_SendBuffer;


    /** Server interface */
    Server* m_Server;


////////////////////////////////////////////////////////////////////////////////
};


////////////////////////////////////////////////////////////////////////////////

#endif

////////////////////////////////////////////////////////////////////////////////

